﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BussinesLayer.Clases;
using CustomControl;
using DTO.Clases;
using Utilities;

namespace Aplicacion.Ventas.Factura
{
    public partial class FrmConsulta : Form
    {
        /// <summary>
        /// Objeto que encapsula la lógica de negocio de Factura Venta.
        /// </summary>
        private BussinesFacturaVenta miBussinesFactura;

        private BussinesFormaPago miBussinesFormaPago;

        #region Paginación

        /// <summary>
        /// Obteien o establece el numero que indica que iteracion se realizo.
        /// </summary>
        private int Iteracion;

        /// <summary>
        /// Obtiene o establece el valor del registro a segir o registro base.
        /// </summary>
        private int RowFactura;

        /// <summary>
        /// Obtiene o establece el número maximo de registro a cargar.
        /// </summary>
        private int RowMaxFactura;

        /// <summary>
        /// Obtiene o establece el total de registros en la base de datos.
        /// </summary>
        private long TotalRowFactura;

        /// <summary>
        /// Obtiene o establece el número total de paginas que componen la consulta.
        /// </summary>
        private long PaginasFactura;

        /// <summary>
        /// Obtiene o establece el número de la pagina actual.
        /// </summary>
        private int CurrentPageFactura;

        /// <summary>
        /// Obtiene o establece el valor de Estado actual de la factura a consultar.
        /// </summary>
        private int EstadoActual;

        /// <summary>
        /// Obtiene o establece el valor del Cliente actual de la factura a consultar.
        /// </summary>
        private string ClienteActual;

        /// <summary>
        /// Obtiene o establece el valor de la primera fecha actual de la factura a consultar.
        /// </summary>
        private DateTime Fecha1Actual;

        /// <summary>
        /// Obtiene o establece el valor de la segunda fecha actual de la factura a consultar.
        /// </summary>
        private DateTime Fecha2Actual;

        #endregion

        private bool ExtendForms = false;

        public FrmConsulta()
        {
            InitializeComponent();
            miBussinesFactura = new BussinesFacturaVenta();
            miBussinesFormaPago = new BussinesFormaPago();
            RowMaxFactura = 5;
        }

        private void FrmConsulta_Load(object sender, EventArgs e)
        {
            CompletaEventos.Completa += new CompletaEventos.CompletaAccion(CompletaEventos_Completo);
            CargarCriterioGeneral();
            CargarPrimerCriterio();
            CargarSegundoCriterio();
            CargarTercerCriterio();
        }

        private void FrmConsulta_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.F10)
            {
                this.tsBtnEditar_Click(this.tsBtnEditar, new EventArgs());
            }
            else
            {
                if (e.KeyData == Keys.F12)
                {
                    this.tsBtnRealizarAbono_Click(this.tsBtnRealizarAbono, new EventArgs());
                }
                else
                {
                    if (e.KeyData == Keys.Escape)
                    {
                        this.Close();
                    }
                }
            }
        }

        private void tsBtnEditar_Click(object sender, EventArgs e)
        {
            var rowFactura = dgvFactura.CurrentRow;
            //var idEstado = (int)rowFactura.Cells["IdEstado"].Value;
            if ((int)rowFactura.Cells["IdEstado"].Value == 3)
            {
                var miFactura = new FacturaVenta();
                //miFactura.EstadoFactura.Id = 3;
                miFactura.EstadoFactura.Id = (int)rowFactura.Cells["IdEstado"].Value;
                miFactura.AplicaDescuento = (bool)rowFactura.Cells["Descuento"].Value;
                miFactura.Proveedor.NitProveedor = (string)rowFactura.Cells["Nit"].Value;
                miFactura.Proveedor.NombreProveedor = (string)rowFactura.Cells["Proveedor"].Value;
                miFactura.Numero = (string)rowFactura.Cells["Numero"].Value;
                miFactura.FechaIngreso = (DateTime)rowFactura.Cells["FechaIngreso"].Value;
                miFactura.Descuento = (double)rowFactura.Cells["DesctoFactura"].Value;
                
                //rowFactura.Cells[""].Value;
                var editFactura = new Edicion.FrmFacturaVenta();
                editFactura.MdiParent = this.MdiParent;
                editFactura.Factura = miFactura;
                editFactura.Productos = Productos();
                editFactura.Edicion = true;
                editFactura.Show();
            }
            else
            {
                OptionPane.MessageInformation("Esta factura no se puede editar.");
            }
        }

        private void tsBtnRealizarAbono_Click(object sender, EventArgs e)
        {
            if (dgvFactura.RowCount != 0)
            {
                var idEstado = (int)dgvFactura.CurrentRow.Cells["IdEstado"].Value;
                if (!txtResta.Text.Equals("0") && idEstado == 2)//idEstado == 2)
                {
                    if (!ExtendForms)
                    {
                        var frmCancelarVenta = new Abonos.FrmCancelarVenta();
                        frmCancelarVenta.NumeroFactura = (string)dgvFactura.CurrentRow.Cells["Numero"].Value;
                        frmCancelarVenta.Abono = true;
                        frmCancelarVenta.txtTotal.Text = txtResta.Text;
                        ExtendForms = true;
                        //frmCancelarVenta.MdiParent = this.MdiParent;
                        frmCancelarVenta.Show();
                    }
                }
                else
                {
                    OptionPane.MessageInformation("Esta factura no tiene saldo pendiente.");
                }
            }
        }

        private void tsBtnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void cbCriterio_SelectionChangeCommitted(object sender, EventArgs e)
        {
            var criterio = Convert.ToInt32(cbCriterio.SelectedValue);
            var criterio2 = Convert.ToInt32(cbCriterio2.SelectedValue);
            txtCodigo.Text = "";
            if (criterio == 1)
            {
                CargarPrimerCriterio();
                txtCodigo.Enabled = true;
                cbCriterio1.Enabled = false;
                btnBuscarCodigo.Enabled = false;
                cbCriterio2.SelectedValue = 1;
                cbCriterio3.Enabled = false;
                dtpFecha1.Enabled = false;
                dtpFecha2.Enabled = false;
                btnBuscar.Enabled = true;
                btnBuscar1.Enabled = false;
                //cbCriterio2.SelectedIndex = 0;
                //cbCriterio2_SelectionChangeCommitted(null, null);
            }
            else
            {
                if (criterio == 2)
                {
                    if (criterio2 != 4)
                    {
                        txtCodigo.Enabled = false;
                        btnBuscarCodigo.Enabled = false;
                        CargarPrimerCriterioOpcion();
                    }
                }
                else
                {
                    txtCodigo.Enabled = true;
                    btnBuscarCodigo.Enabled = true;
                    if (criterio2 != 4)
                    {
                        CargarPrimerCriterio();
                    }
                }
                if (criterio2 != 4)
                {
                    cbCriterio1.Enabled = true;
                }
                else
                {
                    cbCriterio1.Enabled = false;
                }
            }
        }

        private void txtCodigo_KeyPress(object sender, KeyPressEventArgs e)
        {

        }

        private void btnBuscarCodigo_Click(object sender, EventArgs e)
        {

        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            var criterio = (int)cbCriterio.SelectedValue;
            var criterio1 = (int)cbCriterio1.SelectedValue;
            dgvFactura.AutoGenerateColumns = false;
            if (criterio == 1)
            {
                ConsultaNumero(txtCodigo.Text);
            }
            else
            {
                if (criterio == 2)
                {
                    ConsultaEstado(criterio1);
                }
                else
                {
                    if (criterio1 == 0)
                    {
                        ConsultaTodasCliente(txtCodigo.Text);
                    }
                    else
                    {
                        ConsultaEstadoCliente(criterio1, txtCodigo.Text);
                    }
                }
            }
            if (dgvFactura.RowCount != 0)
            {
                dgvFactura_CellClick(this.dgvFactura, null);
            }
            else
            {
                while (dgvListaArticulos.RowCount != 0)
                {
                    dgvListaArticulos.Rows.RemoveAt(0);
                }
            }
        }

        private void cbCriterio2_SelectionChangeCommitted(object sender, EventArgs e)
        {
            var criterio2 = Convert.ToInt32(cbCriterio2.SelectedValue);
            if (criterio2 == 1)
            {
                cbCriterio.Enabled = true;
                //cbCriterio1.Enabled = true;
                cbCriterio3.Enabled = false;
                dtpFecha1.Enabled = false;
                dtpFecha2.Enabled = false;
                btnBuscar.Enabled = true;
                btnBuscar1.Enabled = false;
            }
            else
            {
                if (criterio2 == 2)
                {
                    cbCriterio.SelectedValue = 3;
                    cbCriterio.Enabled = false;
                    cbCriterio1.SelectedValue = 2;
                    cbCriterio1.Enabled = false;
                    btnBuscarCodigo.Enabled = true;
                    btnBuscar.Enabled = false;
                    btnBuscar1.Enabled = true;
                    cbCriterio3.Enabled = false;
                    dtpFecha1.Enabled = false;
                    dtpFecha2.Enabled = false;
                }
                else
                {
                    if (criterio2 == 4)
                    {
                        cbCriterio1.Enabled = false;
                        cbCriterio1.SelectedValue = 2;
                    }
                    else
                    {
                        cbCriterio1.Enabled = true;
                    }
                    //if (criterio2 == 3)
                    //{
                    cbCriterio.Enabled = true;
                        cbCriterio.SelectedValue = 2;
                        //cbCriterio1.Enabled = true;
                        btnBuscar.Enabled = false;
                        btnBuscar1.Enabled = true;
                        cbCriterio3.Enabled = true;
                        dtpFecha1.Enabled = true;
                        dtpFecha2.Enabled = false;
                    //}
                }
            }
            /*if (criterio2 == 3)
            {
                cbCriterio3.Enabled = false;
                dtpFecha1.Enabled = false;
                dtpFecha2.Enabled = false;
                btnBuscar1.Enabled = false;
                btnBuscar.Enabled = true;
            }
            else
            {
                if (criterio2 == 4)
                {
                    cbCriterio3.Enabled = true;
                    dtpFecha1.Enabled = true;
                    btnBuscar1.Enabled = true;
                    btnBuscar.Enabled = false;
                    //cbCriterio.SelectedIndex = 1;
                }
                else
                {
                    if (criterio2 == 2)
                    {
                        cbCriterio.SelectedValue = 3;
                        cbCriterio.Enabled = false;
                        cbCriterio1.SelectedValue = 2;
                        cbCriterio1.Enabled = false;
                    }
                }
            }*/
        }

        private void cbCriterio3_SelectionChangeCommitted(object sender, EventArgs e)
        {
            var criterio3 = Convert.ToInt32(cbCriterio3.SelectedValue);
            if (criterio3 == 1)
            {
                dtpFecha2.Enabled = false;
            }
            else
            {
                dtpFecha2.Enabled = true;
            }
        }

        private void btnBuscar1_Click(object sender, EventArgs e)
        {
            var criterio = (int)cbCriterio.SelectedValue;
            var criterio1 = (int)cbCriterio1.SelectedValue;
            var criterio2 = (int)cbCriterio2.SelectedValue;
            var criterio3 = (int)cbCriterio3.SelectedValue;
            if (criterio2 == 3) //fecha ingreso
            {
                if (criterio == 2) //estado
                {
                    if (criterio3 == 1) //fecha simple
                    {
                        ConsultaEstadoFechaIngreso(criterio1, dtpFecha1.Value);
                    }
                    else
                    {
                        ConsultaEstadoPeriodoIngreso(criterio1, dtpFecha1.Value, dtpFecha2.Value);
                    }
                }
                else
                {
                    if (criterio == 3) //cliente
                    {
                        if (criterio1 != 0)  //estado
                        {
                            if (criterio3 == 2) //periodo fecha
                            {
                                ConsultaPorEstadoClientePeriodoIngreso
                                    (criterio, txtCodigo.Text, dtpFecha1.Value, dtpFecha2.Value);
                            }
                        }
                        else  //todas
                        {
                            if (criterio3 == 1) //fecha simple
                            {
                                ConsultaPorClienteIngreso(txtCodigo.Text, dtpFecha1.Value);
                            }
                            else   //periodo fecha
                            {
                                ConsultaPorClientePeriodoIngreso
                                    (txtCodigo.Text, dtpFecha1.Value, dtpFecha2.Value);
                            }
                        }
                    }
                }
            }
            else
            {
                if (criterio2 == 4)   //fecha limite
                {
                    if (criterio == 2)  //por estado
                    {
                        if (criterio3 == 1)  //fecha simple
                        {
                            ConsultaEstadoFechaLimite(criterio1, dtpFecha1.Value);
                        }
                        else  //periodo fecha
                        {
                            ConsultaCreditoPeriodo(criterio1, dtpFecha1.Value, dtpFecha2.Value);
                        }
                    }
                    else  //por cliente
                    {
                        if (criterio3 == 1)  //fecha simple
                        {
                            ConsultaClienteCreditoLimite(txtCodigo.Text, criterio1, dtpFecha1.Value);
                        }
                        else  //periodo fecha
                        {
                            ConsultaClienteCreditoLimitePeriodo
                                (txtCodigo.Text, criterio1, dtpFecha1.Value, dtpFecha1.Value);
                        }
                    }
                }
                else  //fact. en mora
                {
                    if (String.IsNullOrEmpty(txtCodigo.Text)) //fact. en mora
                    {
                        ConsultaEnMora(criterio1, DateTime.Today);
                    }
                    else //cliente en mora
                    {
                        ConsultaClienteEnMora(txtCodigo.Text, criterio1, DateTime.Today);
                    }
                }
            }
            if (dgvFactura.RowCount != 0)
            {
                dgvFactura_CellClick(this.dgvFactura, null);
            }
            else
            {
                while (dgvListaArticulos.RowCount != 0)
                {
                    dgvListaArticulos.Rows.RemoveAt(0);
                }
            }
        }

        private void dgvFactura_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            dgvListaArticulos.AutoGenerateColumns = false;
            var numero = (string)dgvFactura.CurrentRow.Cells["Numero"].Value;
            var descto = (bool)dgvFactura.CurrentRow.Cells["Descuento"].Value;
            var idEstado = (int)dgvFactura.CurrentRow.Cells["IdEstado"].Value;
            if (descto)
            {
                dgvListaArticulos.Columns["Descto"].HeaderText = "Descto";
                dgvListaArticulos.Columns["ValorMenosDescto"].HeaderText = "Valor - Descto";
                lblDescuento.Text = "DESCUENTO:";
            }
            else
            {
                dgvListaArticulos.Columns["Descto"].HeaderText = "Rcargo";
                dgvListaArticulos.Columns["ValorMenosDescto"].HeaderText = "Valor-Rcargo";
                lblDescuento.Text = "RECARGO:";
            }
            try
            {
                var tabla = miBussinesFactura.ProductoFacturaVenta(numero, descto);
                CalcularTotales(tabla);
                if (idEstado == 2)
                {
                    PagosAFactura(numero);
                }
                dgvListaArticulos.DataSource = tabla;
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
        }

        private void btnInicio_Click(object sender, EventArgs e)
        {
            if (CurrentPageFactura > 1)
            {
                var paginaActual = CurrentPageFactura;
                for (int i = paginaActual; i > 1; i--)
                {
                    RowFactura = RowFactura - RowMaxFactura;
                    CurrentPageFactura--;
                }
                try
                {
                    switch (Iteracion)
                    {
                        case 1:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstado
                                              (EstadoActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 2:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorCliente
                                                 (ClienteActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 3:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorEstadoYcliente
                                          (EstadoActual, ClienteActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 4:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoFechaIngreso
                                            (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 5:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoPeriodoIngreso
                                (EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 6:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorClienteIngreso
                                          (ClienteActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 7:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorClientePeriodoIngreso
                                   (ClienteActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 8:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorEstadoClientePeriodoIngreso
                                (EstadoActual, ClienteActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 9:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoFechaLimite
                                           (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 10:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaCreditoPeriodo
                                (EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 11:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteCreditoLimite
                                (ClienteActual, EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 12:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteCreditoLimitePeriodo
                                (ClienteActual, EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 13:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEnMora
                                (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 14:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteEnMora
                                (ClienteActual, EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                    }
                    lblStatusFactura.Text = CurrentPageFactura + " / " + PaginasFactura;
                    dgvFactura_CellClick(this.dgvFactura, null);
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
            }
        }

        private void btnAnterior_Click(object sender, EventArgs e)
        {
            if (CurrentPageFactura > 1)
            {
                RowFactura = RowFactura - RowMaxFactura;
                if (RowFactura <= 0)
                    RowFactura = 0;
                try
                {
                    switch (Iteracion)
                    {
                        case 1:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstado
                                              (EstadoActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 2:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorCliente
                                                 (ClienteActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 3:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorEstadoYcliente
                                          (EstadoActual, ClienteActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 4:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoFechaIngreso
                                            (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 5:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoPeriodoIngreso
                                (EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 6:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorClienteIngreso
                                          (ClienteActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 7:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorClientePeriodoIngreso
                                   (ClienteActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 8:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorEstadoClientePeriodoIngreso
                                (EstadoActual, ClienteActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 9:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoFechaLimite
                                           (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 10:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaCreditoPeriodo
                                (EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 11:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteCreditoLimite
                                (ClienteActual, EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 12:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteCreditoLimitePeriodo
                                (ClienteActual, EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 13:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEnMora
                                (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 14:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteEnMora
                                (ClienteActual, EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                    }
                    lblStatusFactura.Text = CurrentPageFactura + " / " + PaginasFactura;
                    dgvFactura_CellClick(this.dgvFactura, null);
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
            }
        }

        private void btnSiguiente_Click(object sender, EventArgs e)
        {
            if (CurrentPageFactura < PaginasFactura)
            {
                RowFactura = RowFactura + RowMaxFactura;
                try
                {
                    switch (Iteracion)
                    {
                        case 1:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstado
                                              (EstadoActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 2:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorCliente
                                                 (ClienteActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 3:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorEstadoYcliente
                                          (EstadoActual, ClienteActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 4:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoFechaIngreso
                                            (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 5:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoPeriodoIngreso
                                (EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 6:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorClienteIngreso
                                          (ClienteActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 7:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorClientePeriodoIngreso
                                   (ClienteActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 8:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorEstadoClientePeriodoIngreso
                                (EstadoActual, ClienteActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 9:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoFechaLimite
                                           (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 10:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaCreditoPeriodo
                                (EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 11:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteCreditoLimite
                                (ClienteActual, EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 12:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteCreditoLimitePeriodo
                                (ClienteActual, EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 13:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEnMora
                                (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 14:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteEnMora
                                (ClienteActual, EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                    }
                    lblStatusFactura.Text = CurrentPageFactura + " / " + PaginasFactura;
                    dgvFactura_CellClick(this.dgvFactura, null);
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
            }
        }

        private void btnFin_Click(object sender, EventArgs e)
        {
            if (CurrentPageFactura < PaginasFactura)
            {
                var paginaActual = CurrentPageFactura;
                for (int i = paginaActual; i < PaginasFactura; i++)
                {
                    RowFactura = RowFactura + RowMaxFactura;
                    CurrentPageFactura++;
                }
                try
                {
                    switch (Iteracion)
                    {
                        case 1:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstado
                                              (EstadoActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 2:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorCliente
                                                 (ClienteActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 3:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorEstadoYcliente
                                          (EstadoActual, ClienteActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 4:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoFechaIngreso
                                            (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 5:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoPeriodoIngreso
                                (EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 6:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorClienteIngreso
                                          (ClienteActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 7:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorClientePeriodoIngreso
                                   (ClienteActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 8:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorEstadoClientePeriodoIngreso
                                (EstadoActual, ClienteActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 9:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoFechaLimite
                                           (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 10:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaCreditoPeriodo
                                (EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 11:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteCreditoLimite
                                (ClienteActual, EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 12:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteCreditoLimitePeriodo
                                (ClienteActual, EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 13:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEnMora
                                (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 14:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteEnMora
                                (ClienteActual, EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                    }
                    lblStatusFactura.Text = CurrentPageFactura + " / " + PaginasFactura;
                    dgvFactura_CellClick(this.dgvFactura, null);
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
            }
        }

        /*
         * if (CurrentPageFactura > 1)
            {
         try
                {
                    switch (Iteracion)
                    {
                        case 1:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstado
                                              (EstadoActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 2:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorCliente
                                                 (ClienteActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 3:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorEstadoYcliente
                                          (EstadoActual, ClienteActual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 4:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoFechaIngreso
                                            (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 5:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoPeriodoIngreso
                                (EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 6:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorClienteIngreso
                                          (ClienteActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 7:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorClientePeriodoIngreso
                                   (ClienteActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 8:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaPorEstadoClientePeriodoIngreso
                                (EstadoActual, ClienteActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 9:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoFechaLimite
                                           (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 10:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaCreditoPeriodo
                                (EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 11:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteCreditoLimite
                                (ClienteActual, EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 12:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteCreditoLimitePeriodo
                                (ClienteActual, EstadoActual, Fecha1Actual, Fecha2Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 13:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaEnMora
                                (EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                        case 14:
                            {
                                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteEnMora
                                (ClienteActual, EstadoActual, Fecha1Actual, RowFactura, RowMaxFactura);
                                break;
                            }
                    }
                    lblStatusFactura.Text = CurrentPageFactura + " / " + PaginasFactura;
                    dgvFactura_CellClick(this.dgvFactura, null);
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
          }
         */




        //Metodos.

        /// <summary>
        /// Carga la lista de criterio General de consulta.
        /// </summary>
        private void CargarCriterioGeneral()
        {
            var lst = new List<Inventario.Producto.Criterio>();
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 1,
                Nombre = "Número"
            });
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 2,
                Nombre = "Estado"
            });
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 3,
                Nombre = "Cliente"
            });
            cbCriterio.DataSource = lst;
        }

        private void CargarPrimerCriterio()
        {
            var lst = new List<Inventario.Producto.Criterio>();
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 0,
                Nombre = "Todas"
            });
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 1,
                Nombre = "Contado"
            });
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 2,
                Nombre = "Crédito"
            });
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 3,
                Nombre = "Pendiente"
            });
            cbCriterio1.DataSource = lst;
        }

        private void CargarPrimerCriterioOpcion()
        {
            var lst = new List<Inventario.Producto.Criterio>();
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 1,
                Nombre = "Cancelada"
            });
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 2,
                Nombre = "Crédito"
            });
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 3,
                Nombre = "Pendiente"
            });
            cbCriterio1.DataSource = lst;
        }

        private void CargarSegundoCriterio()
        {
            var lst = new List<Inventario.Producto.Criterio>();
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 1,
                Nombre = ""
            });
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 2,
                Nombre = "Fact. en mora"
            });
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 3,
                Nombre = "Fecha Ingreso"
            });
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 4,
                Nombre = "Fecha Limite"
            });
            cbCriterio2.DataSource = lst;
        }

        private void CargarTercerCriterio()
        {
            var lst = new List<Inventario.Producto.Criterio>();
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 1,
                Nombre = "Fecha simple"
            });
            lst.Add(new Inventario.Producto.Criterio
            {
                Id = 2,
                Nombre = "Periodo de fechas"
            });
            cbCriterio3.DataSource = lst;
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por número.
        /// </summary>
        private void ConsultaNumero(string numero)
        {
            try
            {
                dgvFactura.DataSource = miBussinesFactura.ConsultaNumero(numero);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por Estado de la Factura.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        private void ConsultaEstado(int estado)//iteracion = 1
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 1;
            EstadoActual = estado;
            try
            {
                dgvFactura.DataSource = miBussinesFactura.ConsultaEstado
                                        (estado, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation("No se encontraron Facturas en ese estado.");
                }
                TotalRowFactura = miBussinesFactura.GetRowsConsultaEstado(estado);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por Cliente 
        /// relacionado con la misma.
        /// </summary>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        private void ConsultaTodasCliente(string cliente)//iteracion = 2
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 2;
            ClienteActual = cliente;
            try
            {
                dgvFactura.DataSource = miBussinesFactura.ConsultaPorCliente
                                        (cliente, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation("No se encontraron Facturas con ese Cliente.");
                }
                TotalRowFactura = miBussinesFactura.GetRowsConsultaPorCliente(cliente);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por estado y Cliente.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        private void ConsultaEstadoCliente(int estado, string cliente)//iteracion = 3
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 3;
            EstadoActual = estado;
            ClienteActual = cliente;
            try
            {
                dgvFactura.DataSource = miBussinesFactura.ConsultaPorEstadoYcliente
                                        (estado, cliente, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation
                        ("No se encontraron Facturas con ese Cliente en ese estado.");
                }
                TotalRowFactura = 
                    miBussinesFactura.GetRowsConsultaPorEstadoYcliente(estado, cliente);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        private void ConsultaEstadoFechaIngreso(int estado, DateTime fecha)//iteracion = 4
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 4;
            EstadoActual = estado;
            Fecha1Actual = fecha;
            try
            {
                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoFechaIngreso
                                        (estado, fecha, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation
                        ("No se encontraron Facturas en ese estado y fecha de ingreso.");
                }
                TotalRowFactura = 
                    miBussinesFactura.GetRowsConsultaEstadoFechaIngreso(estado, fecha);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        private void ConsultaEstadoPeriodoIngreso
            (int estado, DateTime fecha1, DateTime fecha2)//iteracion = 5
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 5;
            EstadoActual = estado;
            Fecha1Actual = fecha1;
            Fecha2Actual = fecha2;
            try
            {
                dgvFactura.DataSource = miBussinesFactura.ConsultaEstadoPeriodoIngreso
                                        (estado, fecha1, fecha2, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation
                        ("No se encontraron Facturas en ese estado y entre esas fechas.");
                }
                TotalRowFactura = 
                    miBussinesFactura.GetRowsConsultaEstadoPeriodoIngreso(estado, fecha1, fecha2);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        private void ConsultaPorClienteIngreso(string cliente, DateTime fecha)//iteracion = 6
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 6;
            ClienteActual = cliente;
            Fecha1Actual = fecha;
            try
            {
                dgvFactura.DataSource = miBussinesFactura.ConsultaPorClienteIngreso
                                            (cliente, fecha, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation("No se encontraron Facturas en ese cliente y en esa fecha.");
                }
                TotalRowFactura = miBussinesFactura.GetRowsConsultaPorClienteIngreso(cliente, fecha);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        private void ConsultaPorClientePeriodoIngreso
            (string cliente, DateTime fecha1, DateTime fecha2)//iteracion = 7
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 7;
            ClienteActual = cliente;
            Fecha1Actual = fecha1;
            Fecha2Actual = fecha2;
            try
            {
                dgvFactura.DataSource = miBussinesFactura.ConsultaPorClientePeriodoIngreso
                                              (cliente, fecha1, fecha2, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation
                        ("No se encontraron Facturas en ese cliente y entre esas fechas.");
                }
                TotalRowFactura =
                    miBussinesFactura.GetRowsConsultaPorClientePeriodoIngreso(cliente, fecha1, fecha2);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        private void ConsultaPorEstadoClientePeriodoIngreso//iteracion = 8
            (int estado, string cliente, DateTime fecha1, DateTime fecha2)
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 8;
            try
            {
                dgvFactura.DataSource = miBussinesFactura.ConsultaPorEstadoClientePeriodoIngreso
                                            (estado, cliente, fecha1, fecha2, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation
                        ("No se encontraron Facturas en ese estado, con ese cliente y entre esas fechas.");
                }
                TotalRowFactura =
                miBussinesFactura.GetRowsConsultaPorClientePeriodoIngreso(cliente, fecha1, fecha2);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        private void ConsultaEstadoFechaLimite(int estado, DateTime fecha)//iteracion = 9
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 9;
            EstadoActual = estado;
            Fecha1Actual = fecha;
            try
            {
                dgvFactura.DataSource = 
                    miBussinesFactura.ConsultaEstadoFechaLimite(estado, fecha, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation("No se encontraron Facturas en ese estado y con esa fecha.");
                }
                TotalRowFactura =
                    miBussinesFactura.GetRowsConsultaEstadoFechaLimite(estado, fecha);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        private void ConsultaCreditoPeriodo//iteracion = 10
            (int estado, DateTime fecha1, DateTime fecha2)
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 10;
            EstadoActual = estado;
            Fecha1Actual = fecha1;
            Fecha2Actual = fecha2;
            try
            {
                dgvFactura.DataSource = miBussinesFactura.ConsultaCreditoPeriodo
                                            (estado, fecha1, fecha2, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation("No se encontraron Facturas en ese estado y entre esas fechas.");
                }
                TotalRowFactura =
                    miBussinesFactura.GetRowsConsultaCreditoPeriodo(estado, fecha1, fecha2);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        private void ConsultaClienteCreditoLimite//iteracion = 11
            (string cliente, int estado, DateTime fecha)
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 11;
            ClienteActual = cliente;
            EstadoActual = estado;
            Fecha1Actual = fecha;
            try
            {
                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteCreditoLimite
                                              (cliente, estado, fecha, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation
                        ("No se encontraron Facturas con ese cliente, en ese estado y en esa fecha.");
                }
                TotalRowFactura = 
                    miBussinesFactura.GetRowsConsultaClienteCreditoLimite(cliente, estado, fecha);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        private void ConsultaClienteCreditoLimitePeriodo//iteracion = 12
            (string cliente, int estado, DateTime fecha1, DateTime fecha2)
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 12;
            ClienteActual = cliente;
            EstadoActual = estado;
            Fecha1Actual = fecha1;
            Fecha2Actual = fecha2;
            try
            {
                dgvFactura.DataSource = miBussinesFactura.ConsultaClienteCreditoLimitePeriodo
                                        (cliente, estado, fecha1, fecha2, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation
                        ("No se encontraron Facturas con ese cliente, en ese estado y entre esas fechas.");
                }
                TotalRowFactura =
                miBussinesFactura.GetRowsConsultaClienteCreditoLimitePeriodo(cliente, estado, fecha1, fecha2);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        private void ConsultaEnMora(int estado, DateTime fecha)//iteracion = 13
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 13;
            try
            {
                dgvFactura.DataSource = 
                    miBussinesFactura.ConsultaEnMora(estado, fecha, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation("No se encontraron Facturas en mora.");
                }
                TotalRowFactura = miBussinesFactura.GetRowsConsultaEnMora(estado, fecha);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        private void ConsultaClienteEnMora//iteracion = 14
            (string cliente, int estado, DateTime fecha)
        {
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = 14;
            ClienteActual = cliente;
            try
            {
                dgvFactura.DataSource = 
                miBussinesFactura.ConsultaClienteEnMora(cliente, estado, fecha, RowFactura, RowMaxFactura);
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation("No se encontraron Facturas en mora de ese cliente.");
                }
                TotalRowFactura = 
                    miBussinesFactura.GetRowsConsultaClienteEnMora(cliente, estado, fecha);
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
        }

        /*
            RowFactura = 0;
            CurrentPageFactura = 1;
            Iteracion = ;
            try
            {
                dgvFactura.DataSource = miBussinesFactura
                if (dgvFactura.RowCount == 0)
                {
                    LimpiarGridProducto();
                    OptionPane.MessageInformation("No se encontraron Facturas en ese estado.");
                }
                //TotalRowFactura = miBussinesFactura
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            CalcularPaginas();
         */

        void CompletaEventos_Completo(CompletaArgumentosDeEvento args)
        {
            try
            {
                if (Convert.ToInt32(args.MiObjeto) == 15)
                {
                    ExtendForms = false;
                }
            }
            catch { }
        }





        /// <summary>
        /// Limpia los registro del DataGrid de Producto.
        /// </summary>
        private void LimpiarGridProducto()
        {
            while (dgvListaArticulos.RowCount != 0)
            {
                dgvListaArticulos.Rows.RemoveAt(0);
            }
        }

        /// <summary>
        /// Calcula y muestra el número de paginas devueltas en la consulta.
        /// </summary>
        private void CalcularPaginas()
        {
            PaginasFactura = TotalRowFactura / RowMaxFactura;
            if (TotalRowFactura % RowMaxFactura != 0)
                PaginasFactura++;
            if (CurrentPageFactura > PaginasFactura)
                CurrentPageFactura = 0;
            lblStatusFactura.Text = CurrentPageFactura + " / " + PaginasFactura;
        }

        /// <summary>
        /// Consulta y calcula los totales correspondientes a la factura.
        /// </summary>
        /// <param name="tabla">Tabla que almacena los registros de articulos de la factura.</param>
        private void CalcularTotales(DataTable tabla)
        {
            txtSubTotal.Text = UseObject.InsertSeparatorMil
                (
                  (tabla.AsEnumerable().Sum(s => (s.Field<int>("ValorUnitario") * 
                                            s.Field<int>("Cantidad")))).ToString()
                );

            txtDescuento.Text = UseObject.InsertSeparatorMil
                (
                  (tabla.AsEnumerable()
                   .Sum(d => ((d.Field<int>("ValorUnitario") *
                               UseObject.RemoveCharacter(d["Descuento"].ToString(), '%') / 100) * 
                               d.Field<int>("Cantidad"))))
                   .ToString()
                );

            txtIva.Text = UseObject.InsertSeparatorMil
                (
                  (tabla.AsEnumerable().Sum(i => (i.Field<double>("ValorIva") * 
                                            i.Field<int>("Cantidad")))).ToString()
                );

            txtTotal.Text = UseObject.InsertSeparatorMil
                (
                  (tabla.AsEnumerable().Sum(t => t.Field<double>("Valor"))).ToString()
                );
        }

        private void PagosAFactura(string numero)
        {
            try
            {
                var total = miBussinesFormaPago.GetTotalFormasDePagoDeFacturaVenta(numero);
                if (total > UseObject.RemoveSeparatorMil(txtTotal.Text))
                {
                    txtAbono.Text = txtTotal.Text;
                    txtResta.Text = "0";
                }
                else
                {
                    txtAbono.Text = UseObject.InsertSeparatorMil(total.ToString());
                    txtResta.Text = UseObject.InsertSeparatorMil(
                        (UseObject.RemoveSeparatorMil(txtTotal.Text) - total).ToString());
                }
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
        }

        /// <summary>
        /// Obtiene los registro de Productos de la consulta de Factura en 
        /// una tabla de memoria.
        /// </summary>
        /// <returns></returns>
        private DataTable Productos()
        {
            var tabla = CrearTabla();
            foreach (DataGridViewRow row in dgvListaArticulos.Rows)
            {
                var row_ = tabla.NewRow();
                row_["Save"] = false;
                row_["Id"] = (int)row.Cells["IdProducto"].Value;
                row_["Codigo"] = row.Cells["Codigo"].Value.ToString();
                row_["Articulo"] = row.Cells["Articulo"].Value.ToString();
                row_["Cantidad"] = (int)row.Cells["Cantidad"].Value;
                row_["ValorUnitario"] = (int)row.Cells["Valor"].Value;
                row_["Descuento"] = row.Cells["Descto"].Value.ToString();
                row_["ValorMenosDescto"] = (double)row.Cells["ValorMenosDescto"].Value;
                row_["Iva"] = row.Cells["Iva"].Value.ToString();
                row_["TotalMasIva"] = (double)row.Cells["TotalMasIva"].Value;
                row_["Valor"] = (double)row.Cells["Total"].Value;
                row_["Unidad"] = row.Cells["Unidad"].Value.ToString();
                row_["IdMedida"] = (int)row.Cells["IdMedida"].Value;
                row_["Medida"] = row.Cells["Medida"].Value.ToString();
                row_["IdColor"] = (int)row.Cells["IdColor"].Value;
                row_["Color"] = (Image)row.Cells["Color"].Value;
                tabla.Rows.Add(row_);
            }
            return tabla;
        }

        /// <summary>
        /// Obtiene una tabla en memoria de los productos de la Factura.
        /// </summary>
        /// <returns></returns>
        private DataTable CrearTabla()
        {
            var miTabla = new DataTable();
            miTabla.Columns.Add(new DataColumn("Id", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Codigo", typeof(string)));
            miTabla.Columns.Add(new DataColumn("Articulo", typeof(string)));
            miTabla.Columns.Add(new DataColumn("Cantidad", typeof(string)));
            miTabla.Columns.Add(new DataColumn("ValorUnitario", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Descuento", typeof(string)));
            miTabla.Columns.Add(new DataColumn("ValorMenosDescto", typeof(double)));
            miTabla.Columns.Add(new DataColumn("Iva", typeof(string)));
            miTabla.Columns.Add(new DataColumn("TotalMasIva", typeof(double)));
            miTabla.Columns.Add(new DataColumn("Valor", typeof(double)));
            miTabla.Columns.Add(new DataColumn("Unidad", typeof(string)));
            miTabla.Columns.Add(new DataColumn("IdMedida", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Medida", typeof(string)));
            miTabla.Columns.Add(new DataColumn("IdColor", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Color", typeof(Image)));
            miTabla.Columns.Add(new DataColumn("Save", typeof(bool)));
            return miTabla;
        }

        

    }
}